package com.bdqn;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

/**
 * 获取元素节点属性值
 */
public class Demo01 {

    public static void main(String[] args) {
        // 得到DOM解析器的工厂实例
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            // 从DOM工厂获得DOM解析器
            DocumentBuilder db = dbf.newDocumentBuilder();
            // 解析XML文档，得到一个Document对象，即DOM树
            Document doc = db.parse("ch02/src/main/resources/收藏信息.xml");

            // 得到所有 Brand 元素节点列表信息
            NodeList brandList = doc.getElementsByTagName("Brand");
            // 循环 Brand 节点列表
            for (int i = 0; i < brandList.getLength(); i++) {
                // 依次获得 Brand 节点列表中的元素
                Node brand = brandList.item(i); // 通过doc.getElementsByTagName("Brand")获得的节点列表都中均为Element对象
                // 将节点转换为元素对象
                Element element = (Element) brand; // doc.getElementsByTagName("Brand")获得的节点可以直接转换
                // 获取元素对象的 name 属性
                String attrValue = element.getAttribute("name");
                // 获得元素中的子节点
                NodeList types = element.getChildNodes(); // 通过element.getChildNodes()获得的子节点包含空白字符
                for (int j = 0; j < types.getLength(); j++) {
                    // 依次获得 Brand 元素中子节点列表中的节点
                    Node node = types.item(j);
                    // 对子节点进行类型判断，如果是元素节点Element.ELEMENT_NODE再转换，否则（空白字符）忽略
                    if (node.getNodeType() == Element.ELEMENT_NODE) {
                        // 确定是元素节点之后再将节点转换为元素对象
                        Element typeElement = (Element) node;
                        // 获取元素对象的 name 属性
                        String type = typeElement.getAttribute("name");
                        System.out.println("手机：" + attrValue + " " + type);
                    }
//                    System.out.println(j + " [" + node.getNodeValue() + "]");
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
